package com.newshub.business.mapper;

import com.newshub.business.entity.News;
import com.newshub.business.dto.NewsQueryDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 新闻Mapper接口
 */
@Mapper
public interface NewsMapper {
    
    /**
     * 根据ID查询新闻
     */
    News selectById(@Param("id") Integer id);
    
    /**
     * 插入新闻
     */
    int insert(News news);
    
    /**
     * 根据ID删除新闻
     */
    int deleteById(@Param("id") Integer id);
    
    /**
     * 根据ID更新新闻
     */
    int updateById(News news);
    
    /**
     * 根据标题查询新闻
     * @param title 新闻标题
     * @return 新闻对象
     */
    News selectByTitle(@Param("title") String title);
    
    /**
     * 根据分类ID查询新闻
     * @param categoryId 分类ID
     * @return 新闻列表
     */
    List<News> selectByCategoryId(@Param("categoryId") Integer categoryId);
    
    /**
     * 根据来源ID查询新闻
     * @param sourceId 来源ID
     * @return 新闻列表
     */
    List<News> selectBySourceId(@Param("sourceId") Integer sourceId);
    
    /**
     * 根据时间范围查询新闻
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 新闻列表
     */
    List<News> selectByTimeRange(@Param("startTime") LocalDateTime startTime, 
                                @Param("endTime") LocalDateTime endTime);
    
    /**
     * 查询最新新闻
     * @param limit 限制数量
     * @return 新闻列表
     */
    List<News> selectLatestNews(@Param("limit") Integer limit);
    
    /**
     * 根据关键词搜索新闻
     * @param keyword 关键词
     * @return 新闻列表
     */
    List<News> searchByKeyword(@Param("keyword") String keyword);
    
    /**
     * 根据关键词分页搜索新闻
     * @param keyword 关键词
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 新闻列表
     */
    List<News> searchByKeywordPage(@Param("keyword") String keyword, 
                                   @Param("offset") int offset, 
                                   @Param("limit") int limit);
    
    /**
     * 根据关键词统计搜索结果总数
     * @param keyword 关键词
     * @return 总数
     */
    Long countByKeyword(@Param("keyword") String keyword);
    
    /**
     * 批量插入新闻
     * @param newsList 新闻列表
     * @return 插入数量
     */
    int insertBatch(@Param("newsList") List<News> newsList);
    
    /**
     * 根据ID删除新闻
     * @param id 新闻ID
     * @return 删除数量
     */
    int deleteByIdCustom(@Param("id") Integer id);
    
    /**
     * 更新新闻信息
     * @param news 新闻对象
     * @return 更新数量
     */
    int updateNewsInfo(News news);
    
    /**
     * 根据分类名称查询新闻
     * @param categoryName 分类名称
     * @return 新闻列表
     */
    List<News> selectByCategoryName(@Param("categoryName") String categoryName);
    
    /**
     * 根据来源名称查询新闻
     * @param sourceName 来源名称
     * @return 新闻列表
     */
    List<News> selectBySourceName(@Param("sourceName") String sourceName);
    
    /**
     * 根据外部唯一标识查询新闻（用于去重）
     * @param externalId 外部唯一标识
     * @return 新闻对象
     */
    News selectByExternalId(@Param("externalId") String externalId);
    
    // ==================== 管理功能 ====================
    
    /**
     * 根据查询条件统计新闻总数
     * @param queryDTO 查询条件
     * @return 总数
     */
    Long countByQuery(@Param("queryDTO") NewsQueryDTO queryDTO);
    
    /**
     * 根据查询条件分页查询新闻
     * @param queryDTO 查询条件
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 新闻列表
     */
    List<News> selectByQuery(@Param("queryDTO") NewsQueryDTO queryDTO, 
                             @Param("offset") int offset, 
                             @Param("limit") int limit);
    
    /**
     * 更新新闻信息
     * @param news 新闻对象
     * @return 更新数量
     */
    int update(News news);
    
    /**
     * 批量删除新闻
     * @param ids 新闻ID列表
     * @return 删除数量
     */
    int batchDeleteByIds(@Param("ids") List<Integer> ids);
    
    /**
     * 更新新闻状态
     * @param id 新闻ID
     * @param status 状态
     * @return 更新数量
     */
    int updateStatus(@Param("id") Integer id, @Param("status") Integer status);
    
    /**
     * 更新新闻热点状态
     * @param id 新闻ID
     * @param isHot 是否热点
     * @return 更新数量
     */
    int updateHot(@Param("id") Integer id, @Param("isHot") Integer isHot);

    // ==================== 统计功能 ====================
    
    /**
     * 按天统计新闻发布数量
     * @param days 统计天数
     * @return 统计结果
     */
    List<Map<String, Object>> selectNewsCountByDay(@Param("days") Integer days);
    
    /**
     * 按周统计新闻发布数量
     * @param weeks 统计周数
     * @return 统计结果
     */
    List<Map<String, Object>> selectNewsCountByWeek(@Param("weeks") Integer weeks);
    
    /**
     * 按月统计新闻发布数量
     * @param months 统计月数
     * @return 统计结果
     */
    List<Map<String, Object>> selectNewsCountByMonth(@Param("months") Integer months);
}